package com.example.apkplugdemo;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apkplug.Bundle.BundleControl;
import org.apkplug.Bundle.installCallback;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

import android.content.Context;
/**
 * 替代PropertyInstance.AutoStart()的功能
 * @author 梁前武
 */
public class InstallBundle {
	public void installBundle(Context context,BundleContext mBundleContext,installCallback callback){
				//把BundleDemo1.apk从assets文件夹中移至应用安装目录中
				File f2=null,f3=null,
						f5=null,f6=null,f7=null,f8=null;
				
		        try {
					InputStream in=context.getAssets().open("BundleDemoJni.apk");
					f2=new File(context.getFilesDir(),"BundleDemoJni.apk");
					if(!f2.exists()){
						copy(in, f2);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f2.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
		        //插件Activiyt
		        try {
					InputStream in=context.getAssets().open("BundleDemoStartActivity1.apk");
					f3=new File(context.getFilesDir(),"BundleDemoStartActivity1.apk");
					if(!f3.exists()){
						copy(in, f3);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f3.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
		     
		      //应该先启动 服务 再启动获取服务的插件
		        try {
					InputStream in=context.getAssets().open("BundleDemoShow.apk");
					f5=new File(context.getFilesDir(),"BundleDemoShow.apk");
					if(!f5.exists()){
						copy(in, f5);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f5.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
		      //插件托管服务测试
		        try {
					InputStream in=context.getAssets().open("BundleDemoApkplugService.apk");
					f6=new File(context.getFilesDir(),"BundleDemoApkplugService.apk");
					if(!f6.exists()){
						copy(in, f6);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f6.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
		        //插件托管服务测试
		        try {
					InputStream in=context.getAssets().open("BundleDemoUpdate.apk");
					f7=new File(context.getFilesDir(),"BundleDemoUpdate.apk");
					if(!f7.exists()){
						copy(in, f7);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f7.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
		        //插件托管服务测试
		        try {
					InputStream in=context.getAssets().open("ActivityForResultDemo.apk");
					f8=new File(context.getFilesDir(),"ActivityForResultDemo.apk");
					if(!f8.exists()){
						copy(in, f8);
						// startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
						this.install(mBundleContext,"file:"+f8.getAbsolutePath(),callback,2,false);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
	}
	private void copy(InputStream is, File outputFile)
	        throws IOException
	    {
	        OutputStream os = null;

	        try
	        {
	            os = new BufferedOutputStream(
	                new FileOutputStream(outputFile),4096);
	            byte[] b = new byte[4096];
	            int len = 0;
	            while ((len = is.read(b)) != -1)
	                os.write(b, 0, len);
	        }
	        finally
	        {
	            if (is != null) is.close();
	            if (os != null) os.close();
	        }
	    }
	/**
	  * 安装本地插件服务调用
	  * 详细接口参见 http://www.apkplug.com/javadoc/bundledoc1.5.3/
	  * org.apkplug.Bundle 
     *      接口 BundleControl
	  * @param path
	  * @param callback   安装插件的回掉函数
	  * @throws Exception
	  */
	 private void install(BundleContext mcontext,String path,installCallback callback,int startlevel,boolean isCheckVersion) throws Exception{
		 System.out.println("安装 :"+path);
			ServiceReference reference=mcontext.getServiceReference(BundleControl.class.getName());
	    	if(null!=reference){
	    		BundleControl service=(BundleControl) mcontext.getService(reference);
	    		if(service!=null){
	    			//插件启动级别为1(会自启) 并且不检查插件版本是否相同都安装
	    			service.install(mcontext, path,callback, startlevel,isCheckVersion);
	    		}
	    		mcontext.ungetService(reference);
	    	}
	}
}
